home *** CD-ROM | disk | FTP | other *** search
/ CD World 1997 November / CD World - Kasım 1997.iso / misc / cryptext / rc4.c < prev    next >
C/C++ Source or Header  |  1996-11-09  |  1KB  |  55 lines

  1. // rc4.cpp
  2. #include <windows.h>
  3. #include "rc4.h"
  4.  
  5. static BYTE xyzzy_tmpc;
  6.  
  7. #define SWAP_BYTE(a,b) xyzzy_tmpc=a; a=b; b=xyzzy_tmpc
  8.  
  9. void
  10. rc4Setup (LPBYTE keyDataPtr, int keyDataLen, rc4Key *key)
  11. {
  12.     BYTE    index1;
  13.     BYTE    index2;
  14.     LPBYTE    state;
  15.     int        counter;
  16.  
  17.     state = &key->state[0];
  18.     for (counter = 0; counter < 256; counter++)
  19.         state[counter] = (BYTE)counter;
  20.     key->x = 0;
  21.     key->y = 0;
  22.     index1 = 0;
  23.     index2 = 0;
  24.     for (counter = 0; counter < 256; counter++)
  25.     {
  26.         index2 = (BYTE)(keyDataPtr[index1] + state[counter] + index2);
  27.         SWAP_BYTE(state[counter], state[index2]);
  28.         index1 = (BYTE)(index1 + 1) % keyDataLen;
  29.     }
  30. }
  31.  
  32. void
  33. rc4 (LPBYTE bufferPtr, int bufferLen, rc4Key *key)
  34. {
  35.     BYTE x;
  36.     BYTE y;
  37.     LPBYTE state;
  38.     int counter;
  39.  
  40.     x = key->x;
  41.     y = key->y;
  42.  
  43.     state = &key->state[0];
  44.     for (counter = 0; counter < bufferLen; counter++)
  45.     {
  46.         x++;
  47.         y += state[x];
  48.         SWAP_BYTE(state[x], state[y]);
  49.         bufferPtr[counter] ^= state[(state[x] + state[y]) & 255];
  50.     }
  51.     key->x = x;
  52.     key->y = y;
  53. }
  54.  
  55.